package com.xiaowu.house.config.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xiaowu.house.config.domain.dto.ArgumentAddReqDTO;
import com.xiaowu.house.config.domain.dto.ArgumentDTO;
import com.xiaowu.house.config.domain.dto.ArgumentEditReqDTO;
import com.xiaowu.house.config.domain.dto.ArgumentListReqDTO;
import com.xiaowu.house.config.domain.entity.SysArgument;
import com.xiaowu.house.config.domain.vo.ArgumentVO;
import com.xiaowu.house.config.mapper.SysArgumentMapper;
import com.xiaowu.house.config.service.ISysArgumentService;
import com.xiaowu.house.domain.vo.BasePageVO;
import com.xiaowu.house.exception.ServiceException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


@Service
public class SysArgumentServiceImpl implements ISysArgumentService {

    @Autowired
    private SysArgumentMapper sysArgumentMapper;

    @Override
    public Long add(ArgumentAddReqDTO argumentAddReqDTO) {
        LambdaQueryWrapper<SysArgument> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper
                .eq(SysArgument::getConfigKey, argumentAddReqDTO.getConfigKey())
                .or()
                .eq(SysArgument::getName, argumentAddReqDTO.getName());
        SysArgument sysArgument = sysArgumentMapper.selectOne(lambdaQueryWrapper);
        if (sysArgument != null) {
            throw new ServiceException("参数已存在");
        }
        sysArgument = new SysArgument();
        sysArgument.setConfigKey(argumentAddReqDTO.getConfigKey());
        sysArgument.setName(argumentAddReqDTO.getName());
        sysArgument.setValue(argumentAddReqDTO.getValue());
        if (StringUtils.isNotBlank(argumentAddReqDTO.getRemark())) {
            sysArgument.setRemark(argumentAddReqDTO.getRemark());
        }
        sysArgumentMapper.insert(sysArgument);
        return sysArgument.getId();
    }

    @Override
    public BasePageVO<ArgumentVO> list(ArgumentListReqDTO argumentListReqDTO) {
        BasePageVO<ArgumentVO> result = new BasePageVO<>();
        LambdaQueryWrapper<SysArgument> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(argumentListReqDTO.getName())) {
            lambdaQueryWrapper.like(SysArgument::getName, argumentListReqDTO.getName());
        }
        if (StringUtils.isNotBlank(argumentListReqDTO.getConfigKey())) {
            lambdaQueryWrapper.eq(SysArgument::getConfigKey, argumentListReqDTO.getConfigKey());
        }
        Page<SysArgument> page = sysArgumentMapper
                .selectPage(new Page<>(argumentListReqDTO.getPageNo(),
                        argumentListReqDTO.getPageSize()), lambdaQueryWrapper);
        result.setTotals((int) page.getTotal());
        result.setTotalPages((int) page.getPages());
        List<ArgumentVO> list = new ArrayList<>();
        for (SysArgument sysArgument : page.getRecords()) {
            ArgumentVO argumentVO = new ArgumentVO();
            BeanUtils.copyProperties(sysArgument, argumentVO);
            list.add(argumentVO);
        }
        result.setList(list);
        return result;
    }

    @Override
    public Long edit(ArgumentEditReqDTO argumentEditReqDTO) {
        SysArgument sysArgument = sysArgumentMapper
                .selectOne(new LambdaQueryWrapper<SysArgument>()
                        .eq(SysArgument::getConfigKey, argumentEditReqDTO.getConfigKey()));
        if (sysArgument == null) {
            throw new ServiceException("参数不存在");
        }
        sysArgument = sysArgumentMapper
                .selectOne(new LambdaQueryWrapper<SysArgument>()
                        .eq(SysArgument::getConfigKey, argumentEditReqDTO.getConfigKey())
                        .eq(SysArgument::getName, argumentEditReqDTO.getName()));
        if (sysArgument != null) {
            throw new ServiceException("参数名称冲突");
        }
        sysArgument = new SysArgument();
        BeanUtils.copyProperties(argumentEditReqDTO, sysArgument);
        sysArgumentMapper.updateById(sysArgument);
        return sysArgument.getId();
    }

    @Override
    public ArgumentDTO getByConfigKey(String configKey) {
        SysArgument sysArgument = sysArgumentMapper
                .selectOne(new LambdaQueryWrapper<SysArgument>()
                        .eq(SysArgument::getConfigKey, configKey));
        if (sysArgument == null) {
            return null;
        }
        ArgumentDTO argumentDTO = new ArgumentDTO();
        BeanUtils.copyProperties(sysArgument, argumentDTO);
        return argumentDTO;
    }

    @Override
    public List<ArgumentDTO> getByConfigKeys(List<String> configKeys) {
        List<SysArgument> sysArguments = sysArgumentMapper
                .selectList(new LambdaQueryWrapper<SysArgument>()
                        .in(SysArgument::getConfigKey, configKeys));
        if (sysArguments == null || sysArguments.isEmpty()) {
            return null;
        }
        List<ArgumentDTO> result = new ArrayList<>();
        for (SysArgument sysArgument : sysArguments) {
            ArgumentDTO argumentDTO = new ArgumentDTO();
            BeanUtils.copyProperties(sysArgument, argumentDTO);
            result.add(argumentDTO);
        }
        return result;
    }
}
